1
|
|
|
const argStart = 2 |
2
|
|
|
, argPrefix = "--env-file=" |
3
|
|
|
, {"length": argPrefixLength} = argPrefix |
4
|
|
|
, packagePrefix = "npm_package_config_env_file" |
5
|
|
|
, envPrefix = "ENV_FILE" |
6
|
|
|
|
7
|
|
|
/** |
8
|
|
|
* @see https://github.com/npm/cli/issues/3775 |
9
|
|
|
* @see https://github.com/npm/run-script/issues/37 */ |
10
|
|
|
const npm7delimiter = "\n\n" |
11
|
|
|
|
12
|
|
|
export { |
13
|
|
|
fromArgs, |
14
|
|
|
fromPackageEnv, |
15
|
|
|
fromEnv |
16
|
|
|
} |
17
|
|
|
|
18
|
|
|
function fromArgs<T extends boolean>( |
19
|
|
|
argv: typeof process["argv"], |
20
|
|
|
deleteThem: T |
21
|
|
|
) { |
22
|
|
|
const {length} = argv |
23
|
|
|
// CONSIDER `collected: Set<string>` |
24
|
|
|
, collected: string[] = [] |
25
|
|
|
, indexesToDelete = deleteThem ? [] as number[] : undefined |
26
|
|
|
|
27
|
|
|
for (let i = argStart; i < length; i++) { |
28
|
|
|
const arg = argv[i] |
29
|
|
|
|
30
|
|
|
if (!arg.startsWith(argPrefix)) |
31
|
|
|
continue |
32
|
|
|
|
33
|
|
|
collected.push(arg.substr(argPrefixLength)) |
34
|
|
|
deleteThem && indexesToDelete!.push(i) |
35
|
|
|
} |
36
|
|
|
|
37
|
|
|
const lengthToDelete = indexesToDelete?.length |
38
|
|
|
|
39
|
|
|
if (lengthToDelete) { |
40
|
|
|
let deleteIndex = 0 |
41
|
|
|
, curIndex = indexesToDelete[0] |
42
|
|
|
|
43
|
|
|
for (let preIndex = curIndex; preIndex < length; preIndex++) { |
44
|
|
|
while (preIndex === indexesToDelete[deleteIndex]) { |
45
|
|
|
preIndex++ |
46
|
|
|
deleteIndex++ |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
argv[curIndex] = argv[preIndex] |
50
|
|
|
curIndex++ |
51
|
|
|
} |
52
|
|
|
|
53
|
|
|
argv.length -= lengthToDelete |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
return collected |
57
|
|
|
} |
58
|
|
|
|
59
|
|
|
/** |
60
|
|
|
* @todo Consider calculation as in compose.yml |
61
|
|
|
*/ |
62
|
|
|
function fromPackageEnv(env: Readonly<Env>) { |
63
|
|
|
return fromArrayAsAssoc( |
64
|
|
|
env, |
65
|
|
|
packagePrefix, |
66
|
|
|
env[packagePrefix]?.split(npm7delimiter) ?? [] |
67
|
|
|
) |
68
|
|
|
} |
69
|
|
|
|
70
|
|
|
function fromEnv(env: Readonly<Env>) { |
71
|
|
|
return fromArrayAsAssoc( |
72
|
|
|
env, |
73
|
|
|
envPrefix, |
74
|
|
|
envPrefix in env |
75
|
|
|
? [env[envPrefix]!] |
76
|
|
|
: [] |
77
|
|
|
) |
78
|
|
|
} |
79
|
|
|
|
80
|
|
|
// CONSIDER `collected: Set<string>` |
81
|
|
|
function fromArrayAsAssoc(env: Readonly<Env>, prefix: string, collected: string[]) { |
82
|
|
|
let i = 0 |
83
|
|
|
, key = `${prefix}_${i}` |
84
|
|
|
|
85
|
|
|
while (key in env) { |
86
|
|
|
collected.push(env[key]!) |
87
|
|
|
i++ |
88
|
|
|
key = `${prefix}_${i}` |
89
|
|
|
} |
90
|
|
|
|
91
|
|
|
return collected |
92
|
|
|
} |
93
|
|
|
|